package cuiying.rbac.view;

import cuiying.rbac.domain.dto.RoleDto;
import cuiying.rbac.domain.vo.Result;
import cuiying.rbac.domain.vo.RoleVo;
import cuiying.rbac.service.IRoleService;

import cuiying.rbac.service.array.DeptService;
import cuiying.rbac.service.array.RoleService;


import static cuiying.rbac.Main.MainView;


/**
 * 角色管理
 *
 * @author 崔颖
 * @since 2025/5/5 20:55
 */
public class RoleView extends BaseView<RoleVo, IRoleService >{
    public static final String MENU = """
            ---------------
               部门管理
            ---------------
            | 0 返回上级 |
            | 1 角色列表 |
            | 2 创建角色 |
            | 3 更新角色 |
            | 4 删除角色 |
            ----------------
            请输入选项：""";
    private static RoleView singleton;

    private RoleView() {
        service = RoleService.getInstance();

    }

    public static RoleView getInstance() {
        if (singleton == null) {
            singleton = new RoleView();
        }
        return singleton;
    }

    public static void show() {
    }

    public static void list() {

    }

    public static RoleVo getCacheById() {

        return null;
    }

    public class RoleMain {
        public void show() {
            String menuChoice;
            do {
                System.out.println(MENU);
                menuChoice = MainView.input.nextLine();
                switch (menuChoice) {
                    case "0" -> System.out.println("已返回上一级菜单");
                    case "1" -> list();
                    case "2" -> create();
                    case "3" -> update();
                    case "4" -> delete();
                    default -> System.out.println("输入非法，请输入正确的菜单编号");
                }
            } while (!"0".equals(menuChoice));
        }

        public void list() {
            Result result = service.list();
            cache = (RoleVo[]) result.data;
            System.out.println("ID\t部门名称\t部门数据访问范围");
            for (RoleVo Role : cache) {
                System.out.printf("%d\t%s\t%s\n", Role.id, Role.name, Role.dataScope);
            }
        }
        //查看部门列表

        public void create() {
            System.out.print("请输入部门名称：");
            String name = MainView.input.nextLine();
            System.out.print("请输入部门数据访问范围，输入的值应该为[个人，部门，全局]其中之一");
            String dataScope = null;
            do {
                String str = MainView.input.nextLine();
                if ("个人".equals(str) || "部门".equals(str) || "全局".equals(str)) {
                    dataScope = str;
                } else {
                    printError("输入的值不合法，输入值应该为[个人，部门，全局]其中之一");
                }
            }
            while (dataScope == null);
            RoleDto dto = new RoleDto(name, dataScope);
            Result result = service.create(dto);
            if (!result.success) {
                printError(result.message);
                return;
            }
            System.out.println(result.message);
            list();

        }


        public void update() {
            RoleVo Role = getCacheById();
            if (Role == null) {
                return;
            }
            System.out.print("请输入角色名称，直接回车表示不修改");
            String name = MainView.input.nextLine();
            name = "".equals(name) ? Role.name : name;
            System.out.print("请输入角色名称，直接回车表示不修改，输入值应该为[个人，部门 ，" +
                    "全局]其中之一：");
            String dataScope = null;
            do {
                String str = MainView.input.nextLine();
                if ("个人".equals(str) || "部门".equals(str) || "全局".equals(str)) {
                    dataScope = str;
                } else if ("".equals(str)) {
                    RoleDto role = null;
                    dataScope = role.dataScope;

                } else {
                    printError("输入的值不合法，输入值应该为[个人，部门，全局]其中之一");
                }
            }
            while (dataScope == null);
            RoleDto dto = new RoleDto(name, dataScope);
            Result result = service.create(dto);
            if (!result.success) {
                printError(result.message);
                return;
            }
            System.out.println(result.message);
            list();
        }

        public void delete() {
            RoleVo Role = getCacheById();
            if (Role == null) {
                return;
            }


            System.out.print("输入'Y'确认删除，输入其他则取消删除：");
            String confirm = MainView.input.nextLine();

            if (!"Y".equalsIgnoreCase(confirm)) {
                System.out.println("您已取消删除");
                return;
            }
            Result result = service.delete(Role.id);
            if (!result.success) {
                printError(result.message);
                return;
            }
            System.out.println(result.message);
            list();

        }
    }
}


public static void printMenu() {
    String menu = """
                    ---------------
                       部门管理
                    ---------------
                    | 0 返回上级 |
                    | 1 角色列表 |
                    | 2 创建角色 |
                    | 3 更新角色 |
                    | 4 删除角色 |
                    ----------------
                    请输入选项：""";
    System.out.print(menu);
}

public static void printError(String message) {
    System.out.println("\033[31m" + message + "\033[0m");
}

public static void list() {
    Result result = roleService.list();
    cache = (RoleVo[]) result.data;
    System.out.println("ID\t部门名称\t部门数据访问范围");
    for (RoleVo Role : cache) {
        System.out.printf("%d\t%s\t%s\n", Role.id, Role.name, Role.dataScope);
    }
}
//查看部门列表

public static void create() {
    System.out.print("请输入部门名称：");
    String name = MainView.input.nextLine();
    System.out.print("请输入部门数据访问范围，输入的值应该为[个人，部门，全局]其中之一");
    String dataScope = null;
    do {
        String str = MainView.input.nextLine();
        if ("个人".equals(str) || "部门".equals(str) || "全局".equals(str)) {
            dataScope = str;
        } else {
            printError("输入的值不合法，输入值应该为[个人，部门，全局]其中之一");
        }
    }
    while (dataScope == null);
    RoleDto dto = new RoleDto(name, dataScope);
    Result result = roleService.create(dto);
    if (!result.success) {
        printError(result.message);
        return;
    }
    System.out.println(result.message);
    list();

}


public static void update() {
    RoleVo Role = getCacheById();
    if (Role == null) {
        return;
    }
    System.out.print("请输入角色名称，直接回车表示不修改");
    String name = MainView.input.nextLine();
    name = "".equals(name) ? Role.name : name;
    System.out.print("请输入角色名称，直接回车表示不修改，输入值应该为[个人，部门 ，" +
            "全局]其中之一：");
    String dataScope = null;
    do {
        String str = MainView.input.nextLine();
        if ("个人".equals(str) || "部门".equals(str) || "全局".equals(str)) {
            dataScope = str;
        } else if("".equals(str)){
            RoleDto role = null;
            dataScope = role.dataScope;

        }else {
            printError("输入的值不合法，输入值应该为[个人，部门，全局]其中之一");
        }
    }
    while (dataScope == null);
    RoleDto dto = new RoleDto(name, dataScope);
    Result result = roleService.create(dto);
    if (!result.success) {
        printError(result.message);
        return;
    }
    System.out.println(result.message);
    list();
}

public static void delete() {
    RoleVo Role = getCacheById();
    if (Role == null) {
        return;
    }


    System.out.print("输入'Y'确认删除，输入其他则取消删除：");
    String confirm = MainView.input.nextLine();

    if (!"Y".equalsIgnoreCase(confirm)) {
        System.out.println("您已取消删除");
        return;
    }
    Result result = roleService.delete(Role.id);
    if (!result.success) {
        printError(result.message);
        return;
    }
    System.out.println(result.message);
    list();

}

public static RoleVo getCacheById() {
    System.out.print("请输入ID，ID必须是大于0的整数");
    if (!MainView.input.hasNextInt()) {
        MainView.input.nextInt();
        printError("ID必须为整数，请输入整数值");
        return null;
    }
    int id = MainView.input.nextInt();
    MainView.input.nextLine();
    if (id < 1) {
        printError("ID必须大于0，请重新输入");
        return null;
    }
    if (cache == null) {
        Result result = roleService.list();
        cache = (RoleVo[]) result.data;
    }

    RoleVo Role = null;
    for (RoleVo item : cache) {
        if (item.id == id) {
            System.out.println("该ID对应的数据是：");
            System.out.printf("ID:%d,名称：%s,数据访问范围：%s\n", item.id, item.name
                    , item.dataScope);
            Role = item;
            break;
        }
    }
    if (Role == null) {
        printError("当前没有该ID对应的数据");
        return null;
    }


    return Role;
}
    }
            }
